package fiuba.algo3.algoThieft.controlador;


import java.awt.Choice;
import java.awt.Frame;
import java.awt.TextComponent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
import java.io.IOException;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import org.xml.sax.SAXException;

import fiuba.algo3.algoThieft.modelo.Capital;
import fiuba.algo3.algoThieft.modelo.ErrorNoExisteElPersonaje;
import fiuba.algo3.algoThieft.modelo.ErrorNoSeInicioUnNuevoCaso;
import fiuba.algo3.algoThieft.modelo.ErrorPersonajeNoAsignado;
import fiuba.algo3.algoThieft.modelo.ErrorYaExisteElPersonaje;
import fiuba.algo3.algoThieft.modelo.Juego;
import fiuba.algo3.algoThieft.modelo.Ladron;
import fiuba.algo3.algoThieft.modelo.Lugar;
import fiuba.algo3.algoThieft.modelo.Personaje;
import fiuba.algo3.algoThieft.modelo.PersonajePolicial;
import fiuba.algo3.algoThieft.modelo.Pista;
import fiuba.algo3.algoThieft.vista.DialogMensaje;

public class Controlador {
	
	
	
	private Juego modelo;
	private String nombre;
	private String nombreLugar;
	private String nombreCapital;
	
	private String sexo = "";
	private String hobby = "";
	private String cabello = "";
	private String senia = "";
	private String vehiculo = "";

	public Controlador(Juego modelo) {
		this.modelo = modelo;
	}
	
	private class EscuchaBotonAceptar implements ActionListener
	{	public void actionPerformed(ActionEvent e) 
		{
		PersonajePolicial personaje = new Personaje( nombre );
		
		if (modelo.existePersonaje(personaje)){
			try {
				modelo.utilizarPersonaje(personaje);				
				modelo.iniciarCaso();
				
			} catch (ErrorNoExisteElPersonaje e1) {
				noExisteElPersonaje();
			} catch (SAXException e1) {
				archivosDaniados();
			} catch (IOException e1) {
				archivosDaniados();
			} catch (ParserConfigurationException e1) {
				archivosDaniados();
			} catch (ErrorPersonajeNoAsignado e1) {
				e1.printStackTrace();
			}
			
		}
		modelo.actualizarObservadores();	

		}

	}

	public ActionListener getListenerBotonAceptar() {
		
		return new EscuchaBotonAceptar();
	}
	
	
	private class EscuchaTextoNombre implements TextListener {

		
		public void textValueChanged(TextEvent e) {
			TextComponent tc = (TextComponent)e.getSource();
	    	nombre = tc.getText();

		}

	}
	
	public TextListener getListenerTextoNombre() {
		
		return new EscuchaTextoNombre();
	}

	private class EscuchaDialogoCrearPersonaje implements ActionListener
	{	public void actionPerformed(ActionEvent e) 
		{
		String respuesta = e.getActionCommand();
		if (respuesta.equals("Si")){
			try {
				PersonajePolicial personaje = new Personaje(nombre);
				modelo.agregarPersonaje(personaje);
				modelo.utilizarPersonaje(personaje);
				modelo.iniciarCaso();
			} catch (ErrorNoExisteElPersonaje e1) {
				noExisteElPersonaje();
			} catch (ErrorYaExisteElPersonaje e1) {
				yaExisteElPersonaje();
			} catch (SAXException e1) {
				archivosDaniados();
			} catch (IOException e1) {
				archivosDaniados();
			} catch (ParserConfigurationException e1) {
				archivosDaniados();
			} catch (ErrorPersonajeNoAsignado e1) {
				e1.printStackTrace();
			}						
		modelo.actualizarObservadores();
		}
				
		}

	}
	
	public ActionListener getListenerDialogoCrearPersonaje() {
		return new EscuchaDialogoCrearPersonaje();
	}

	private class EscuchaChoiceLugar implements ItemListener  {

		
		@Override
		public void itemStateChanged(ItemEvent arg0) {
			Choice tc = (Choice)arg0.getSource();
	    	nombreLugar = tc.getSelectedItem();
	    	
		}

		
		

	}
	
	public ItemListener getListenerChoiceLugar() {
		
		return new EscuchaChoiceLugar();
	}

	
private class EscuchaChoiceCapital implements ItemListener  {

		
		@Override
		public void itemStateChanged(ItemEvent arg0) {
			Choice tc = (Choice)arg0.getSource();
	    	nombreCapital = tc.getSelectedItem();
			
		}

		
		

	}
	
	public ItemListener getListenerChoiceCapital() {
		
		return new EscuchaChoiceCapital();
	}

	
	
	
	private class EscuchaBotonVisitar implements ActionListener
	{	public void actionPerformed(ActionEvent e) 
		{
				try {
					PersonajePolicial personaje = modelo.getPersonajeActual();			
					List<Lugar> lugares = personaje.getUbicacion().getLugares();
					for ( Lugar lugar : lugares ){
						if (lugar.getNombre().equals(nombreLugar)){
					
							Pista pista = modelo.gestionarVisita(lugar);
							if ( !( pista.comoString().equals("Encontraste el escondite del ladron ! ! !") ) ){
								String cadena = pista.comoString();
								new DialogMensaje( new Frame(), nombreLugar , cadena );								
								nombreLugar = "";
								
								}
							modelo.actualizarObservadores();
							}
						
						}
					
					} catch (ErrorNoSeInicioUnNuevoCaso e1) {
						noSeInicioCaso();
					}
		}

	}
	
	public ActionListener getListenerBotonEscuchaBotonVisitar() {
		
		return new EscuchaBotonVisitar();
	}

	
	
	private class EscuchaBotonViajar implements ActionListener
	{	public void actionPerformed(ActionEvent e) 
		{
				try {
					PersonajePolicial personaje = modelo.getPersonajeActual();			
					List<Capital> capitales = personaje.getUbicacion().getCapitalesAdyacentes();
					for ( Capital capital : capitales ){
						
						if (capital.getNombre().equals(nombreCapital)){				
							modelo.gestionarViaje(capital);
							nombreCapital="";
							modelo.actualizarObservadores();
							}
						}
					
					} catch (ErrorNoSeInicioUnNuevoCaso e1) {
						noSeInicioCaso();
					}
		}

	}
	
	public ActionListener getListenerBotonEscuchaBotonViajar() {
		
		return new EscuchaBotonViajar();
	}

	
	private class EscuchaDialogoNuevoCaso implements ActionListener
	{	public void actionPerformed(ActionEvent e) 
		{
		try {
			modelo.guardarAvances();
		} catch (ParserConfigurationException e2) {
			archivosDaniados();
		} catch (TransformerException e2) {
			archivosDaniados();
		}
		String respuesta = e.getActionCommand();
		if (respuesta.equals("Si")){
			try {
				vaciarCadenasDeCaracteristicas();
				modelo.iniciarCaso();				
			} catch (SAXException e1) {
				archivosDaniados();
			} catch (IOException e1) {
				archivosDaniados();
			} catch (ParserConfigurationException e1) {
				archivosDaniados();
			} catch (ErrorPersonajeNoAsignado e1) {
				e1.printStackTrace();
			}	
			
		}else{
			System.exit(0);
		}
		
			

		}

	}
	
	public ActionListener getListenerDialogoNuevoCaso() {
		
		return new EscuchaDialogoNuevoCaso();
	}

	
	private class EscuchaChoiceSexo implements ItemListener  {
		@Override
		public void itemStateChanged(ItemEvent arg0) {
			Choice tc = (Choice)arg0.getSource();
	    	sexo = tc.getSelectedItem();
		}
	}
	public ItemListener getListenerChoiceSexo() {
		
		return new EscuchaChoiceSexo();
	}

	private class EscuchaChoiceHobby implements ItemListener  {
		@Override
		public void itemStateChanged(ItemEvent arg0) {
			Choice tc = (Choice)arg0.getSource();
	    	hobby = tc.getSelectedItem();
		}
	}
	public ItemListener getListenerChoiceHobby() {
		
		return new EscuchaChoiceHobby();
	}
	
	private class EscuchaChoiceCabello implements ItemListener  {
		@Override
		public void itemStateChanged(ItemEvent arg0) {
			Choice tc = (Choice)arg0.getSource();
			cabello = tc.getSelectedItem();
		}
	}
	public ItemListener getListenerChoiceCabello() {
		
		return new EscuchaChoiceCabello();
	}
	
	private class EscuchaChoiceSenia implements ItemListener  {
		@Override
		public void itemStateChanged(ItemEvent arg0) {
			Choice tc = (Choice)arg0.getSource();
			senia = tc.getSelectedItem();
		}
	}
	public ItemListener getListenerChoiceSenia() {
		
		return new EscuchaChoiceSenia();
	}
	
	private class EscuchaChoiceVehiculo implements ItemListener  {
		@Override
		public void itemStateChanged(ItemEvent arg0) {
			Choice tc = (Choice)arg0.getSource();
			vehiculo = tc.getSelectedItem();
		}
	}
	public ItemListener getListenerChoiceVehiculo() {
		
		return new EscuchaChoiceVehiculo();
	}
	
	private class EscuchaBotonBuscar implements ActionListener
	{	public void actionPerformed(ActionEvent e) 
		{	
		
			if (e.getActionCommand().equals("Buscar en la base de datos")){
				try {				
				List<Ladron> resultado = modelo.gestionarEmisionDeOrdenDeArresto(sexo, hobby, cabello, senia, vehiculo);
				if (modelo.ordenDeArrestoEmitida()){
					new DialogMensaje( new Frame(), "Orden de arresto emitida" , "El sospechoso buscado es " + resultado.get(0).getNombre() );					
				}else{
					if (resultado.isEmpty()){
						new DialogMensaje( new Frame(), "Orden de arresto NO emitida" , "Ningun sospechoso cumple con las caracteristicas indicadas" );
					}else{
						new DialogMensaje( new Frame(), "Orden de arresto NO emitida" , "Varios sospechoso cumple con las caracteristicas indicadas" , "La orden solo se emite cuando hay un unico sospechoso" );
					}
				}
					
			} catch (ErrorNoSeInicioUnNuevoCaso e1) {
				noSeInicioCaso();
				}
			vaciarCadenasDeCaracteristicas();
			}
			
			modelo.actualizarObservadores();
				
		}

	}

	public ActionListener getListenerBotonBuscar() {
		
		return new EscuchaBotonBuscar();
	}

	public void noSeInicioCaso() {
		System.out.print("ERROR: no se inicio un nuevo caso");
		
	}
	
	public void archivosDaniados() {
		System.out.print("ERROR: los archivos del juego estan daniados");
		
	}
	
	public void yaExisteElPersonaje() {
		System.out.print("ERROR: ya existe un personaje con ese nombre");
		
	}
	
	public void noExisteElPersonaje() {
		System.out.print("ERROR: no existe un personaje con ese nombre");
		
	}
	
	private void vaciarCadenasDeCaracteristicas(){

		sexo = "";
		hobby = "";
		cabello = "";
		senia = "";
		vehiculo = "";
	}
	
}


